/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.uch.biblioteca.managedBeans;

import javax.faces.model.SelectItem;
import java.util.List;
import net.uch.biblioteca.mapping.TbCatalogo;
import net.uch.util.CommonDAO;
import java.util.ArrayList;
import net.uch.biblioteca.hibernateSpringDao.HSBibCatalogoDetalleDAO;
import net.uch.biblioteca.mapping.BibCatalogoDetalle;
import javax.faces.component.UIParameter;
import javax.faces.event.ActionEvent;
import java.util.Date;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import net.uch.biblioteca.hibernateSpringDao.HSBibPrestamoDAO;
import net.uch.biblioteca.mapping.*;
import org.apache.tomcat.jni.BIOCallback;
import javax.servlet.http.HttpSession;
import net.uch.biblioteca.hibernateSpringDao.HSBibEjemplarDAO;

public class mbBusquedaReserva {

    private String sDoc_descripcion;
    private String sTipoBusqueda;
    private String iCat_col_id = "0";
    private int iDoc_id;
    private String sDoc_cod = "";
    private String sDoc_tit = "";
    private String sDoc_aut = "";
    private String sDoc_Ubi = "";
    private String sDoc_PieImp = "";
    private String sDoc_DesFis = "";
    private String sDoc_Tema = "";
    private int iDoc_cont = 0;
    private String oncomplete = "";
    private SelectItem[] cboColeccion;
    private List<mbBusquedaReserva> documentos = new ArrayList<mbBusquedaReserva>();
    mbBusquedaReserva catdet;
    int id_cat = 0;
    List<BibEjemplar> eje;
    BibLector lec;
    // RESERVAR DOCUMENTO
    private int iLec_id = 0;
    private String sEjemplar_id = "";
    private String sLec_tip_id = "";
    private String sPre_Tip_id = "";
    private Date dFec_pres = new Date();
    private Date dFec_dev = new Date();
    private SelectItem[] cboLecTip;
    private SelectItem[] cboPreTip;

    //CONSTRUCTORES
    public mbBusquedaReserva() {
    }

    public mbBusquedaReserva(int a) {
    }

    // SETTER Y GUETTER
    public BibLector getLec() {
        return lec;
    }

    public void setLec(BibLector lec) {
        this.lec = lec;
    }

    public SelectItem[] getCboLecTip() {
        try {

            List lstLecTip = CommonDAO.getTbCatalogoDAO().seleccionarCatalogo("003");
            if (lstLecTip.size() > 0) {
                cboLecTip = new SelectItem[lstLecTip.size() + 1];
                cboLecTip[0] = new SelectItem("0", "[Seleccione]");
                for (int i = 0; i < lstLecTip.size(); i++) {
                    cboLecTip[i + 1] = new SelectItem(((TbCatalogo) lstLecTip.get(i)).getCatCodigoGrupo() + ((TbCatalogo) lstLecTip.get(i)).getCatCodigoElemento(), ((TbCatalogo) lstLecTip.get(i)).getCatDescripcionElemento());
                }
            } else {
                cboLecTip = new SelectItem[1];
                cboLecTip[0] = new SelectItem(0, "[Seleccione]");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cboLecTip;
    }

    public void setCboLecTip(SelectItem[] cboLecTip) {
        this.cboLecTip = cboLecTip;
    }

    public SelectItem[] getCboPreTip() {
        try {
            List lstPreTip = CommonDAO.getTbCatalogoDAO().seleccionarCatalogo("002");
            if (lstPreTip.size() > 0) {
                cboPreTip = new SelectItem[lstPreTip.size() + 1];
                cboPreTip[0] = new SelectItem("0", "[Seleccione]");
                for (int i = 0; i < lstPreTip.size(); i++) {
                    cboPreTip[i + 1] = new SelectItem(((TbCatalogo) lstPreTip.get(i)).getCatCodigoGrupo() + ((TbCatalogo) lstPreTip.get(i)).getCatCodigoElemento(), ((TbCatalogo) lstPreTip.get(i)).getCatDescripcionElemento());
                }
            } else {
                cboPreTip = new SelectItem[1];
                cboPreTip[0] = new SelectItem(0, "[Seleccione]");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cboPreTip;
    }

    public void setCboPreTip(SelectItem[] cboPreTip) {
        this.cboPreTip = cboPreTip;
    }

    public Date getdFec_dev() {
        return dFec_dev;
    }

    public void setdFec_dev(Date dFec_dev) {
        this.dFec_dev = dFec_dev;
    }

    public Date getdFec_pres() {
        return dFec_pres;
    }

    public void setdFec_pres(Date dFec_res) {
        this.dFec_pres = dFec_res;
    }

    public int getiLec_id() {
        return iLec_id;
    }

    public void setiLec_id(int iLec_id) {
        this.iLec_id = iLec_id;
    }

    public String getsEjemplar_id() {
        return sEjemplar_id;
    }

    public void setsEjemplar_id(String sEjemplar_id) {
        this.sEjemplar_id = sEjemplar_id;
    }

    public String getsLec_tip_id() {
        return sLec_tip_id;
    }

    public void setsLec_tip_id(String sLec_tip_id) {
        this.sLec_tip_id = sLec_tip_id;
    }

    public String getsPre_Tip_id() {
        return sPre_Tip_id;
    }

    public void setsPre_Tip_id(String sPre_Tip_id) {
        this.sPre_Tip_id = sPre_Tip_id;
    }

    public mbBusquedaReserva getCatdet() {
        return catdet;
    }

    public void setCatdet(mbBusquedaReserva catdet) {
        this.catdet = catdet;
    }

    public String getsDoc_DesFis() {
        return sDoc_DesFis;
    }

    public void setsDoc_DesFis(String sDoc_DesFis) {
        this.sDoc_DesFis = sDoc_DesFis;
    }

    public String getsDoc_PieImp() {
        return sDoc_PieImp;
    }

    public void setsDoc_PieImp(String sDoc_PieImp) {
        this.sDoc_PieImp = sDoc_PieImp;
    }

    public String getsDoc_Tema() {
        return sDoc_Tema;
    }

    public void setsDoc_Tema(String sDoc_Tema) {
        this.sDoc_Tema = sDoc_Tema;
    }

    public String getsDoc_Ubi() {
        return sDoc_Ubi;
    }

    public void setsDoc_Ubi(String sDoc_Ubi) {
        this.sDoc_Ubi = sDoc_Ubi;
    }

    public int getiDoc_id() {
        return iDoc_id;
    }

    public void setiDoc_id(int iDoc_id) {
        this.iDoc_id = iDoc_id;
    }

    public String getOncomplete() {
        return oncomplete;
    }

    public void setOncomplete(String oncomplete) {
        this.oncomplete = oncomplete;
    }

    public int getiDoc_cont() {
        return iDoc_cont;
    }

    public void setiDoc_cont(int iDoc_cont) {
        this.iDoc_cont = iDoc_cont;
    }

    public String getsDoc_aut() {
        return sDoc_aut;
    }

    public void setsDoc_aut(String sDoc_aut) {
        this.sDoc_aut = sDoc_aut;
    }

    public String getsDoc_cod() {
        return sDoc_cod;
    }

    public void setsDoc_cod(String sDoc_cod) {
        this.sDoc_cod = sDoc_cod;
    }

    public String getsDoc_tit() {
        return sDoc_tit;
    }

    public void setsDoc_tit(String sDoc_tit) {
        this.sDoc_tit = sDoc_tit;
    }

    public String getsTipoBusqueda() {
        return sTipoBusqueda;
    }

    public void setsTipoBusqueda(String sTipoBusqueda) {
        this.sTipoBusqueda = sTipoBusqueda;
    }

    public List<mbBusquedaReserva> getDocumentos() {
        return documentos;
    }

    public void setDocumentos(List<mbBusquedaReserva> documentos) {
        this.documentos = documentos;
    }

    public String getsDoc_descripcion() {
        return sDoc_descripcion;
    }

    public void setsDoc_descripcion(String sDoc_descripcion) {
        this.sDoc_descripcion = sDoc_descripcion;
    }

    public SelectItem[] getCboColeccion() {
        try {

            List lstCol = CommonDAO.getTbCatalogoDAO().seleccionarCatalogo("004");
            if (lstCol.size() > 0) {
                cboColeccion = new SelectItem[lstCol.size() + 1];
                cboColeccion[0] = new SelectItem("0", "[Seleccione]");
                for (int i = 0; i < lstCol.size(); i++) {
                    cboColeccion[i + 1] = new SelectItem(((TbCatalogo) lstCol.get(i)).getCatCodigoGrupo() + ((TbCatalogo) lstCol.get(i)).getCatCodigoElemento(), ((TbCatalogo) lstCol.get(i)).getCatDescripcionElemento());
                }
            } else {
                cboColeccion = new SelectItem[1];
                cboColeccion[0] = new SelectItem("0", "[Seleccione]");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cboColeccion;
    }

    public void setCboColeccion(SelectItem[] cboColeccion) {
        this.cboColeccion = cboColeccion;
    }

    public String getiCat_col_id() {
        return iCat_col_id;
    }

    public void setiCat_col_id(String iCat_col_id) {
        this.iCat_col_id = iCat_col_id;
    }

    public void Buscar() throws Exception {

        HSBibCatalogoDetalleDAO daoDet = CommonDAO.getBibCatalogoDetalleDAO();


        if (!"0".equals(this.iCat_col_id) && !"".equals(this.sDoc_descripcion)) {
            List lstDocumentos = daoDet.traerDocumentos(this.iCat_col_id, this.sDoc_descripcion, this.sTipoBusqueda);
            this.documentos = new ArrayList<mbBusquedaReserva>();

            for (int i = 0; i < lstDocumentos.size(); i++) {
                mbBusquedaReserva documento = new mbBusquedaReserva(0);

                int cat_id = ((BibCatalogoDetalle) lstDocumentos.get(i)).getCatId();
                List<BibCatalogoDetalle> det = CommonDAO.getBibCatalogoDetalleDAO().SeleccionarDoc(cat_id);

                documento.setiDoc_id(cat_id);
                documento.setiDoc_cont(i + 1);

                for (int j = 0; j < det.size(); j++) {
                    String CatDet = "";
                    String CatDet2 = "";
                    if ("923".equals(det.get(j).getMarCodi())) {
                        CatDet = det.get(j).getMarCont();
                    } else {
                        CatDet2 = det.get(j).getMarCont().substring(2, det.get(j).getMarCont().length());
                        String[] detalleseparado = CatDet2.split("\\^");
                        System.out.println("num: " + j);
                        for (int u = 0; u < detalleseparado.length; u++) {
                            if (detalleseparado[u].length() == 0) {
                                CatDet += " ";
                            } else {
                                if (u == 0) {                             
                                    CatDet = detalleseparado[u];
                                } else {
                                    CatDet += "/" + detalleseparado[u].substring(1, detalleseparado[u].length());
                                }

                            }

                            //System.out.println("detall separado: "+detalleseparado[u].substring(0, detalleseparado[u].length()));
                        }

                    }


                    if ("082".equals(det.get(j).getMarCodi())) { // CODIGO
                        documento.setsDoc_cod(CatDet);
                    }

                    if ("100".equals(det.get(j).getMarCodi()) || "700".equals(det.get(j).getMarCodi())
                            || "710".equals(det.get(j).getMarCodi()) || "711".equals(det.get(j).getMarCodi())) { // AUTOR

                        String autor = documento.getsDoc_aut() == null || documento.getsDoc_aut().isEmpty() ? "" : documento.getsDoc_aut() + "; ";
                        autor += CatDet;
                        documento.setsDoc_aut(autor);
                    }

                    if ("245".equals(det.get(j).getMarCodi()) || "730".equals(det.get(j).getMarCodi())
                            || "856".equals(det.get(j).getMarCodi()) || "853".equals(det.get(j).getMarCodi())) { // TITULO

                        String titulo = documento.getsDoc_tit() == null || documento.getsDoc_tit().isEmpty() ? "" : documento.getsDoc_tit() + "; ";
                        titulo += CatDet;
                        documento.setsDoc_tit(titulo);
                    }

                    if ("923".equals(det.get(j).getMarCodi())) { // UBICACION
                        documento.setsDoc_Ubi(CatDet);
                    }

                    if ("260".equals(det.get(j).getMarCodi())) { // PIE DE IMPRENTA
                        documento.setsDoc_PieImp(CatDet);
                    }

                    if ("300".equals(det.get(j).getMarCodi())) { // DESCRIPCION FISICA
                        documento.setsDoc_DesFis(CatDet);
                    }

                    if ("600".equals(det.get(j).getMarCodi()) || "610".equals(det.get(j).getMarCodi())
                            || "611".equals(det.get(j).getMarCodi()) || "650".equals(det.get(j).getMarCodi())
                            || "651".equals(det.get(j).getMarCodi())) { // DESCRIPCION FISICA


                        String tema = documento.getsDoc_Tema() == null || documento.getsDoc_Tema().isEmpty() ? "" : documento.getsDoc_Tema() + " <br />";
                        tema += CatDet;
                        documento.setsDoc_Tema(tema);
                    }
                }

                documentos.add(documento);

            }

        } else {
            this.setOncomplete("javascript:alert('Debe seleccionar un Tipo de Documento y una Descripcion.');");
        }
    }

    public void DetalleDoc(ActionEvent event) {
        id_cat = Integer.parseInt(((UIParameter) event.getComponent().findComponent("id_detalle")).getValue().toString());


        for (int i = 0; i < documentos.size(); i++) {
            if (documentos.get(i).getiDoc_id() == id_cat) {
                catdet = documentos.get(i);
                break;
            }
        }

        this.setOncomplete("Richfaces.showModalPanel('mpDetalleDoc')");

    }

    public void ReservarDoc() {
        dFec_pres = new Date();
        System.out.println("id_cat: " + id_cat);
        HSBibCatalogoDetalleDAO daoDet = CommonDAO.getBibCatalogoDetalleDAO();

        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        HttpSession session = (HttpSession) context.getSession(true);
        lec = (BibLector) session.getAttribute("lector");

        eje = daoDet.EjemplaresxDocumento(id_cat);
        
        if(lec==null){
            this.setOncomplete("javascript:alert('Debe logearse como lector');");
        }
        else if (!eje.isEmpty()) {
            this.setOncomplete("Richfaces.showModalPanel('mpReservarDoc')");
        } else {
            this.setOncomplete("javascript:alert('No hay ejemplares disponibles');");
        }

    }

    public void guardarReserva(ActionEvent event) throws Exception {
        this.setOncomplete("");

        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        HttpSession session = (HttpSession) context.getSession(true);
        lec = (BibLector) session.getAttribute("lector");

        HSBibPrestamoDAO daoPre = CommonDAO.getBibPrestamoDocDAO();
        HSBibEjemplarDAO daoEje = CommonDAO.getBibEjemplarDAO();
        BibPrestamo pre = new BibPrestamo();

        pre.setBibLector(new BibLector(lec.getLecId()));
        pre.setLecTip(lec.getLecTip());
        pre.setBibEjemplar(eje.get(0));
        pre.setPreTip(this.getsPre_Tip_id());
        pre.setPreFecActual(this.getdFec_pres());
        pre.setPreFecProdev(this.getdFec_dev());
        pre.setPreEst("1".charAt(0));
        pre.setPreObs("");
        pre.setUsuId(0);// falta settear
        pre.setOpeTip("001003");
        pre.setRenPreId(0);

        daoPre.guardarPrestamo(pre);
        daoEje.actualizarEjemplar(eje.get(0).getEjeId(), "1");
        this.setOncomplete("javascript:alert('Reserva Satisfactoria, Pase a recojer el Documento Solicitado.');Richfaces.hideModalPanel('mpReservarDoc')");

    }
}
